package main

import (
	"github.com/micro/go-micro/v2"
	"github.com/micro/go-micro/v2/registry"
	"github.com/micro/go-micro/v2/registry/etcd"
	"golang.org/x/net/context"
	"log"
	"time"
	pb "todolist/task-srv/proto/task"
	"todolist/task-srv/repository"
)

func main() {
	log.SetFlags(log.Llongfile)
	// 客户端也注册为服务
	server := micro.NewService(
		micro.Name("go.micro.client.task"),
		// 配置etcd为注册中心
		micro.Registry(etcd.NewRegistry(
			registry.Addrs("139.155.239.206:2379"),
		)),
	)
	// 服务初始化
	server.Init()

	taskService := pb.NewTaskService("go.micro.service.task", server.Client())

	// 调用服务生成3条任务
	now := time.Now()
	insertTask(taskService, "起床时间到", now.Unix(), now.Add(time.Minute*10).Unix())
	insertTask(taskService, "吃早饭", now.Add(time.Hour*24).Unix(), now.Add(time.Hour*48).Unix())
	insertTask(taskService, "去上班", now.Add(time.Hour*48).Unix(), now.Add(time.Hour*72).Unix())

	// 分页查询任务列表
	page, err := taskService.Search(context.Background(), &pb.SearchRequest{
		PageCode: 1,
		PageSize: 20,
	})
	if err != nil {
		log.Fatal("search failed", err)
	}
	log.Println("查询结果：", page)

	// 更新第一条记录为完成
	row := page.Rows[0]
	_, err = taskService.Finished(context.Background(), &pb.Task{
		Id:         row.Id,
		IsFinished: repository.Finished,
	})
	if err != nil {
		log.Fatal("finished failed", err)
	}
	log.Println("更新记录完成")

	// 修改查询到的第二条数据,延长截至日期
	row = page.Rows[1]
	if _, err = taskService.Modify(context.Background(), &pb.Task{
		// todo 只修改一条数据，可以不要前3个参数吗
		Id:        row.Id,
		Body:      row.Body,
		StartTime: row.StartTime,
		EndTime:   now.Add(time.Hour * 72).Unix(),
	}); err != nil {
		log.Fatal("modify failed", err)
	}
	log.Println("modify success")

	// 删除第三条记录
	row = page.Rows[2]
	if _, err = taskService.Delete(context.Background(), &pb.Task{
		Id: row.Id,
	}); err != nil {
		log.Fatal("delete failed", err)
	}
	log.Println("delete success")

	// 再次分页查询，校验修改结果
	page, err = taskService.Search(context.Background(), &pb.SearchRequest{})
	if err != nil {
		log.Fatal("search ", err)
	}
	log.Println(page)
}

func insertTask(taskService pb.TaskService, body string, start, end int64) {
	_, err := taskService.Create(context.Background(), &pb.Task{
		UserId:    "10000",
		Body:      body,
		StartTime: start,
		EndTime:   end,
	})
	if err != nil {
		log.Fatal("create ", err)
	}
	log.Println("create task success!")
}
